Autoyaのlink.xml Generator作った回


概要

Autoya 0.9.5のリリースが完了した。

このリリースでは、わりと「ずっと前から欲しかったんだけど入れられなかった機能」みたいなのを入れた。


・link.xml を生成する機構

・AssetGraphでAssetBundleをビルドした時についでにlink.xmlを合成出力する機構

・こまかなバグフィックス


などが更新内容。


このなかで、AssetGraph -> AB作成 -> link.xml生成が熱い。



AssetBundleとアプリ内含有Assetの関係

iOSとかAndroidでのAssetBundleの使用がマストなので、こう、

「そのABに入ってるAssetはコンパイルに含まれてないのでロードした瞬間、死!!!」

みたいなのが怖い。


そこでいろいろな方法があるわけなんだけど、


Autoyaでは、link.xmlを生成することで対処した。


link.xml Generator

AssetのクラスID値(int)を与えるとlink.xmlを吐き出す。

これ。

https://github.com/sassembla/Autoya/blob/master/Assets/Editor/Autoya.AssetGraphIntegration/LinkXMLGenerator.cs#L60


単体で抜き出しても使えるので、興味ある人はどうぞ。



で、ここで渡すクラスID値とは何か。

間違ってもここのこれではない

https://docs.unity3d.com/Manual/ClassIDReference.html

この資料ほんんんんんんっっっっっっっっっとーに最悪なことに、間違いまくっている。


なので、クラスID値を知りたい人は、


とりあえずAssetBundleをビルドしてmanifestファイルを見よう。

こんな感じのやつが出てくる。

https://github.com/sassembla/Autoya/blob/master/AssetBundles/main_assets/iOS/nestedprefab.manifest#L12


ManifestFileVersion: 0

CRC: 2200902407

Hashes:

  AssetFileHash:

    serializedVersion: 2

    Hash: c088a4b2797e99ed3c95d8ce957816af

  TypeTreeHash:

    serializedVersion: 2

    Hash: 11817dad4d3c8e9c24248d58700284ea

HashAppended: 0

ClassTypes:

- Class: 1

  Script: {instanceID: 0}

- Class: 4

  Script: {instanceID: 0}

- Class: 23

  Script: {instanceID: 0}

- Class: 102

  Script: {instanceID: 0}

- Class: 114

  Script: {fileID: 11500000, guid: 7e73406419bf54a50a1b5faf24749c6c, type: 3}

- Class: 115

  Script: {instanceID: 0}

Assets:

- Assets/AutoyaTests/RuntimeData/AssetBundles/MainResources/nestedPrefab.prefab

Dependencies:

- /Users/passepied/Desktop/autoya/Editor/AssetGraph-1.3-release/UnityEngine.AssetBundleGraph/Cache/AssetBundles/4e024a18-af2d-4f29-9f4b-1212e005d1ea/iOS/texturename1


ここの、Class: 1 とかが、「そのABに含まれているAssetの」「Unity内での」クラスIDの値になっている。

ほらね、簡単でしょう?



この数値はmetaファイルとかからは取得できない。できたら別のアプローチとかもあると思うんだけど。



現状のまとめ

Autoyaでは、AssetBundleを作成する際にAssetGraphを使っており、AGのビルド時に独自のAssetBundleListを作る機構を提供している。


で、


List作成のついでに、ビルドしたAssetBundleのmanifestから、ABに含まれる全てのAssetのクラスIDを収集し、

そのIDをもとにlink.xmlを生成している。


すでにファイルがある場合は必要な分をマージする。

これによって、複数のAGのグラフからABをビルドしても一つのlink.xmlがいい感じに太っていくようになる。